{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>no surfacing</th>\n",
       "      <th>flippers</th>\n",
       "      <th>fish</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>no</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>no</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>no</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   no surfacing  flippers fish\n",
       "0             1         1  yes\n",
       "1             1         1  yes\n",
       "2             1         0   no\n",
       "3             0         1   no\n",
       "4             0         1   no"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data={\n",
    "    'no surfacing':[1,1,1,0,0],\n",
    "    'flippers':[1,1,0,1,1],\n",
    "    'fish':['yes','yes','no','no','no']\n",
    "}\n",
    "df=pd.DataFrame(data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    yes\n",
       "1    yes\n",
       "2     no\n",
       "3     no\n",
       "4     no\n",
       "Name: fish, dtype: object"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "no     0.6\n",
       "yes    0.4\n",
       "Name: fish, dtype: float64"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:,-1].value_counts(True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "def calEnt(df):\n",
    "    #计算每一个标签值的概率（频率）：数组\n",
    "    p_v=df.iloc[:,-1].value_counts(True)\n",
    "    return   -(np.log2(p_v)*p_v).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9709505944546686"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calEnt(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['no surfacing', 'flippers'], dtype='object')"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns[:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bestSplit(df):\n",
    "    baseEnt = calEnt(df)\n",
    "    colName = ''\n",
    "    infoGain = 0\n",
    "    bestGain = 0\n",
    "    for col in df.columns[:-1]:\n",
    "        #当前colmun（特征），不同取值的概率\n",
    "        p_v = df[col].value_counts(True)\n",
    "        ent_v= []\n",
    "        #此特征的所有值，循环计算熵\n",
    "        for value in p_v.index:\n",
    "            #col在不同取值下的熵\n",
    "            ent_v.append(calEnt(df[df[col] == value]))\n",
    "        infoGain = baseEnt - (ent_v*p_v).sum()\n",
    "        #print(\"@\",infoGain)\n",
    "        if(infoGain > bestGain):\n",
    "            bestGain = infoGain\n",
    "            colName = col\n",
    "    return colName\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'no surfacing'"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestSplit(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "def mySplit(df,col,value):\n",
    "   return df[df[col]==value].drop(col,axis=1) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>flippers</th>\n",
       "      <th>fish</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>no</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>no</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   flippers fish\n",
       "3         1   no\n",
       "4         1   no"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mySplit(df,'no surfacing',0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'no'"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:,-1].value_counts(True).index[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "def createTree(df):\n",
    "   \n",
    "    #获取最后一列标签值\n",
    "    labelFreq = df.iloc[:,-1].value_counts(True)\n",
    "    #截止条件：label只剩一列数据或者df只剩下一种取值（包含只剩一行）\n",
    "    if labelFreq[0] == 1 or df.shape[1] ==1:\n",
    "        #取概率最高的特征值\n",
    "        return labelFreq.index[0]\n",
    "    #最优划分特征\n",
    "    bestCol = bestSplit(df)\n",
    "    valueSet = set(df[bestCol])\n",
    "    #根据最有特征建立子树\n",
    "    tree = {bestCol:{}}\n",
    "    for value in valueSet:\n",
    "        #删除已用特征值和列，递归调用\n",
    "        tree[bestCol][value] = createTree(mySplit(df,bestCol,value))\n",
    "\n",
    "    return tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "myTree = createTree(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.save('my.npy',myTree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.load('my.npy',allow_pickle=True).item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myTree = np.load('my.npy',allow_pickle=True).item()\n",
    "myTree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "inX = {\n",
    "    'no surfacing':0,\n",
    "    'flippers':1\n",
    "\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['flippers'])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myTree['no surfacing'][1].keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'no surfacing'"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "next(iter(myTree))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getValueFromTree(inX,Tree):\n",
    "    colName = next(iter(myTree))\n",
    "    colVal = inX[colName]\n",
    "    #取出对应特征值的子树\n",
    "    return Tree[colName][colVal]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "def classify(inX,Tree):\n",
    "    #为valua增加key（特征值的从来_name）\n",
    "    inX = dict(zip(df.columns[:-1],inX))\n",
    "    #遍历子树，直到子节点（即，非dict变量）\n",
    "    label = getValueFromTree(inX,Tree)\n",
    "    while type(label) == dict:\n",
    "        label=getValueFromTree(inX,Tree)\n",
    "    return label\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'no'"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classify([0,1],myTree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn import tree\n",
    "from sklearn.datasets import load_iris\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = load_iris()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Text(0.4, 0.8333333333333334, 'X[0] <= 0.5\\ngini = 0.4\\nsamples = 5\\nvalue = [[2, 3]\\n[1, 4]]'),\n",
       " Text(0.2, 0.5, 'gini = 0.0\\nsamples = 2\\nvalue = [[2, 0]\\n[0, 2]]'),\n",
       " Text(0.6, 0.5, 'X[1] <= 0.5\\ngini = 0.222\\nsamples = 3\\nvalue = [[0, 3]\\n[1, 2]]'),\n",
       " Text(0.4, 0.16666666666666666, 'gini = 0.0\\nsamples = 1\\nvalue = [[0, 1]\\n[1, 0]]'),\n",
       " Text(0.8, 0.16666666666666666, 'gini = 0.0\\nsamples = 2\\nvalue = [[0, 2]\\n[0, 2]]')]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "iris=load_iris()\n",
    "clf = DecisionTreeClassifier(max_leaf_nodes=3,random_state=0)\n",
    "x_train = np.array(df.iloc[:, :-1])\n",
    "y_train = np.array(df.iloc[:, :-1])\n",
    "clf = clf.fit(x_train, y_train)\n",
    "tree.plot_tree(clf)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "a6dc62afd8b03c17538a9dfce2fcb18f62cec380cc7b77050462a64b7e4e4814"
  },
  "kernelspec": {
   "display_name": "Python 3.8.0 32-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
